{
  // 声明一个接口  但是一般都会大驼峰命名法
  interface BoyFriend{
    name: string; // 分隔符可以是 『,』 也可以是『;』 也可以『不写』
    age: number;
    car ?: string;
    readonly id: number;
    cook: () => void;  //对象方法的形参个数是可以少于接口定义时方法的形参个数的, 但是不推荐
  }

  //声明一个对象
  let jincheng:BoyFriend = {
    name: 'jincheng',
    age: 20,
    id: 1,
    cook(){
      console.log('会做川菜');
    }
  };

  let chunhui:BoyFriend = {
    name: 'chunhui',
    age: 22,
    car: 'byd',
    id: 2,
    cook(){
      console.log('会做粤菜');
    }
  };

}

{

  //基本信息接口
  interface BaseInfo{
    name: string; // 分隔符可以是 『,』 也可以是『;』 也可以『不写』
    age: number;
  }

  interface BoyFriend extends BaseInfo{
    car ?: string;
    readonly id: number;
    cook: (cai: string) => void;  //对象方法的形参个数是可以少于接口定义时方法的形参个数的, 但是不推荐
  }

  interface TechStaff extends BaseInfo{
    program: (language: string) => void;
  }

  //定义类  implements 实现
  class BoyStu implements BoyFriend, TechStaff{
    name: string;
    age: number;
    car?:string;
    id: number;
    className: string;

    //构造方法
    constructor(name:string, age:number, id:number, className: string, car ?:string){
      this.name = name;
      this.age = age;
      this.id = id;
      this.car = car;
      this.className = className;
    }

    //做饭的方法
    cook(cai: string){
      console.log(`我可以做 ${cai} 菜品`)
    }

    //学习
    learn(){
      console.log('可以学习哦~~');
    }

    //编程
    program(language: string){
      console.log(`我可以编写 ${language} 程序`)
    }
  }

  //实例化
  let jiakai = new BoyStu('jiakai', 20, 3, '三年二班', '雅阁');

  // jiakai.program('JavaScript');
}

{
  //接口的多继承
  interface A{
    a: string;
  }

  interface B{
    b: string;
  }

  interface C extends A,B{
    c: string;
  }

  class Test implements C{
    a: string = 'aaa';
    b: string = 'bbb';
    c: string = 'ccc';
  }

}

{
  //接口的重复声明
  interface A{
    a: string;
  }

  interface A{
    b: string;
  }

  class Test implements A{
    a: string = 'aa';
    b: string = 'bb';
  }

}